package NetWorkTest1;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpServer {

    //创建DatagramSocket相当于在操作系统内核中打开了socket文件
    //就可以发送和接收数据了
    private DatagramSocket socket = null;

    public UdpServer(int port) throws SocketException {
        //这里的udp服务器要指定端口号
        socket = new DatagramSocket(port);
    }

    //开始启动服务器
    public void start() throws IOException {
        System.out.println("服务器启动成功!!!");
        while(true){
            //接收服务器请求
            //将要接收的数据放到requestPacket的数据报中--用byte数组将数据保存起来--指定长度
            DatagramPacket requestPacket = new DatagramPacket(
                    new byte[4096],4096);
            //Udp协议主要面向数据报--以数据报为基本单位进行传送
            socket.receive(requestPacket);
            //根据请求进行解析--将数据报转换成字符串
            //将数据报的数据放到字符串中,指定0-length长度
            String request = new String(requestPacket.getData(),0,
                    requestPacket.getLength());
            //实现的是回显服务器--给出什么样的请求--就做出怎么样的响应
            String response = process(request);
            //要将响应发送给客户端
            //1.以数据报的形式发送--需要将字符串--转化为数据报
            //2.从哪里来(requestPacket) 就发到哪里去
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),
                    response.getBytes().length,requestPacket.getSocketAddress());
            //发送数据报
            socket.send(responsePacket);
            System.out.printf("[%s : %d] req = %s; rep = %s\n",requestPacket.getAddress().toString(),
                    requestPacket.getPort(),request,response);
        }
    }
    public String process(String request){
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpServer server = new UdpServer(8000);
        server.start();
    }

}
